package com.iweb.server;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

// 在线测试 http://coolaf.com/tool/chattest
// 这里 userId 是传过来的 实际可用通过鉴权得到
@Slf4j
@ServerEndpoint("/imAll/{userId}")  // 请求的url
@Component
public class WebAllSocketServer {

    // 线程安全的 用来存放每个客户端对应的 Session 单机可以这么做，集群的情况下需要 mysql 或者 redis 改造 sendMessage 方法
    private static ConcurrentHashMap<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * 连接成功后调用的方法
     *
     * @param session : 用户的会话对象
     * @param userId
     */
    @OnOpen
    public void open(Session session, @PathParam("userId") String userId) {
        log.info("{}连接了", userId);
        clients.put(userId, session);
    }

    /**
     * 断开连接
     *
     * @param session
     * @param userId
     */
    @OnClose
    public void close(Session session, @PathParam("userId") String userId) {
        log.info("{}断开了", userId);
        clients.remove(userId);
    }

    /**
     * 发生异常调用
     *
     * @param t
     */
    @OnError
    public void error(Throwable t) {
        t.printStackTrace();
    }

    @OnMessage
    public void message(String message, @PathParam("userId") String userId) {
        log.info("服务器接收到{}发送的消息：{}", userId, message);
        sendAll(message);
    }

    private void sendAll(String message) {
        // 读取结合中的客户端,遍历后向所有用户发送消息
        clients.forEach((userId, session) -> {
            session.getAsyncRemote().sendText(message);
        });
    }

}
